package com.minimalist.common.feign.client.lindi;

import com.minimalist.common.feign.config.FeignConfig;
import com.minimalist.common.feign.fallback.lindi.LindiDataviewFeignClientFallbackFactory;
import com.minimalist.common.response.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.List;
import java.util.Map;

/**
 * 林地指标交易平台_数据可视化 Feign 客户端
 *
 * @author 11987
 */
@FeignClient(name = "minimalist-lindi"
        , contextId = "lindiDataviewFeignClient"
        , path = "/minimalist/lindi/dashboard"
        , configuration = FeignConfig.class
        , fallbackFactory = LindiDataviewFeignClientFallbackFactory.class)
public interface LindiDataviewFeignClient {

    /**
     * 建立SSE连接，用于实时推送数据
     *
     * @param clientId 客户端ID
     * @return SSE连接
     */
    @GetMapping(value = "/sse/connect", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    @Operation(summary = "建立SSE连接")
    SseEmitter connect(@RequestParam(value = "clientId", required = false) String clientId);

    /**
     * 启动数据推送定时任务
     *
     * @return 操作结果
     */
    @PostMapping("/sse/start-push")
    @Operation(summary = "启动数据推送")
    R<?> startDataPush();

    /**
     * 停止数据推送
     *
     * @return 操作结果
     */
    @PostMapping("/sse/stop-push")
    @Operation(summary = "停止数据推送")
    R<?> stopDataPush();

    /**
     * 获取当前连接数
     *
     * @return 连接信息
     */
    @GetMapping("/sse/connections")
    @Operation(summary = "获取当前SSE连接数")
    R<Map<String, Object>> getConnections();

    /**
     * 手动触发数据推送
     *
     * @return 操作结果
     */
    @PostMapping("/sse/push-now")
    @Operation(summary = "手动触发数据推送")
    R<?> pushDataNow();

    /**
     * 获取平台统计概览
     *
     * @return 平台统计概览数据
     */
    @GetMapping("/overview")
    @Operation(summary = "获取平台统计概览")
    R<Map<String, Object>> getOverview();

    /**
     * 获取各街道镇区林地面积数据
     *
     * @return 各街道镇区林地面积数据
     */
    @GetMapping("/area-statistics")
    @Operation(summary = "获取各街道镇区林地面积数据")
    R<List<Map<String, Object>>> getAreaStatistics();

    /**
     * 获取各镇区街道林地交易情况
     *
     * @return 各镇区街道林地交易情况
     */
    @GetMapping("/trade-statistics")
    @Operation(summary = "获取各镇区街道林地交易情况")
    R<List<Map<String, Object>>> getTradeStatistics();

    /**
     * 获取资金营收统计
     *
     * @return 资金营收统计数据
     */
    @GetMapping("/revenue-statistics")
    @Operation(summary = "获取资金营收统计")
    R<List<Map<String, Object>>> getRevenueStatistics();

    /**
     * 获取地图数据
     *
     * @return 地图数据
     */
    @GetMapping("/map-data")
    @Operation(summary = "获取地图数据")
    R<List<Map<String, Object>>> getMapData();

    /**
     * 获取林地补贴申请统计
     *
     * @return 林地补贴申请统计数据
     */
    @GetMapping("/subsidy-statistics")
    @Operation(summary = "获取林地补贴申请统计")
    R<List<Map<String, Object>>> getSubsidyStatistics();

    /**
     * 获取企业信息注册统计
     *
     * @return 企业信息注册统计数据
     */
    @GetMapping("/company-statistics")
    @Operation(summary = "获取企业信息注册统计")
    R<List<Map<String, Object>>> getCompanyStatistics();

    /**
     * 获取交易订单统计
     *
     * @return 交易订单统计数据
     */
    @GetMapping("/order-statistics")
    @Operation(summary = "获取交易订单统计")
    R<Map<String, Object>> getOrderStatistics();
}